package com.shujia.day06;

public class Demo07InnerClass {
    static class InnerClass3 {
        public void innerFunction() {
            System.out.println("这是静态内部类中的一个成员方法");
        }
    }

    public static void main(String[] args) {
        /*
            TODO 内部类
                1. 当类定义在另一个类中时，该类称为  成员内部类
                    需求：创建成员内部类对象并调用其方法
                    逻辑：
                        成员内部类 是成员，属于外部类对象的 所以需要先构建外部类的对象
                            通过调用对象的 new 再创建 成员内部类 的对象
                            例如：new OuterClass().new InnerClass1();


         */
        OuterClass.InnerClass1 innerClass1 = new OuterClass().new InnerClass1();
        innerClass1.innerFunction();

        // 调用另外一个类中的静态内部类
        OuterClass.InnerClass2 innerClass2 = new OuterClass.InnerClass2();
        // 调用当前类中的静态内部类
        InnerClass3 innerClass3 = new InnerClass3();

        // 通过方法调用其局部内部类
        OuterClass.useInnerClassFun();

        // 通过接口构建了一个匿名的内部类 进行实现
        OuterInterface outerInterface = new OuterInterface() {
            @Override
            public void innerFunction() {
                System.out.println("这是接口的匿名内部类所实现的方法");
            }
        };
        //  TODO: 该方式不是接口的实例调用，而是匿名内部类的对象进行调用
        outerInterface.innerFunction();

        // TODO 对抽象类构建匿名对象
        new OuterAbstractClass() {
            @Override
            public void innerFunction() {
                System.out.println("这是抽象类的匿名内部类所实现的方法");
            }
        }.innerFunction();

    }
}

/*
   为了使用方便，将多个class定义在一个.java文件中，相当于在包中定义了一个类
        但是一个.java文件只能有一个 public 修饰的class类  OuterClass 不是内部类
 */
class OuterClass {
    /*
        TODO 成员内部类 => 属于外部类对象的
     */
    class InnerClass1 {
        public void innerFunction() {
            System.out.println("这是成员内部类中的一个成员方法");
        }
    }

    /*
        TODO 静态内部类  => 属于外部类

     */
    static class InnerClass2 {
        public void innerFunction() {
            System.out.println("这是静态内部类中的一个成员方法");
        }
    }

    public static void useInnerClassFun() {
        int i = 10; // 局部变量
        /*
            TODO 局部内部类
                 会随着方法的调用而创建，随着方法的结束而消失
         */
        class InnerClass4 {
            public void innerFunction() {
                System.out.println("这是局部内部类中的一个成员方法");
            }
        }
        new InnerClass4().innerFunction();
    }

}

/*
    TODO 匿名内部类
        需求：当存在接口，对其中的抽象方法，仅使用一次 或者需要构建接口的对象时，可以不定义具体的类
            使用匿名内部类方式进行操作
 */
interface OuterInterface{
    public void innerFunction() ;
}

abstract class OuterAbstractClass{
    // TODO 对于抽象类 抽象方法需要添加 abstract 修饰
    public abstract void innerFunction() ;
}